#include<bits/stdc++.h>
using namespace std;
int tr[(1<<19)],n,m,a[100005],b[100005],c[100005],_,x[4];
char s[(1<<19)];
void build(int k,int l,int r,int dep){
    //cout<<k<<' '<<l<<' '<<r<<' '<<s[k]<<endl;
    if(l==r){
        tr[k]=l;
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid,dep-1);
    build(k<<1|1,mid+1,r,dep-1);
    if(s[k]=='0'){
        if(b[tr[k<<1]]>=dep) tr[k]=tr[k<<1];
        else tr[k]=tr[k<<1|1];
    }
    else{
        if(b[tr[k<<1|1]]>=dep) tr[k]=tr[k<<1|1];
        else tr[k]=tr[k<<1];
    }
    return;
}
int query(int k,int l,int r,int L,int R){
    if(L<=l&&r<=R){
        return tr[k];
    }
    int mid=(l+r)>>1;
    return query(k<<1,l,mid,L,R);
}
signed main(){
    freopen("arena.in","r",stdin);
    freopen("arena.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>c[i];
    }
    int lg=0;
    while((1<<lg)<n){
        lg++;
    }
    for(int i=lg;i>=1;i--){
        for(int j=1;j<=(1<<(i-1));j++){
            cin>>s[(1<<(i-1))+j-1];
        }
    }
    cin>>_;
    while(_--){
        cin>>x[0]>>x[1]>>x[2]>>x[3];
        for(int i=1;i<=n;i++){
            b[i]=a[i]^x[i%4];
        }
        build(1,1,1<<(lg),lg);
        int ans=0;
        for(int i=1;i<=m;i++){
            if(c[i]==1){
                ans^=(i*1);
            }
            else{
                ans^=(i*query(1,1,1<<(lg),1,c[i]));
            } //cout<<i<<' '<<query(1,1,1<<lg,1,c[i])<<' '<<i*query(1,1,1<<lg,1,c[i])<<endl;
                
        }
        cout<<ans<<endl;
    }
    return 0;
}
/*
5 5
0 0 0 0 0
5 4 1 2 3
1001
10
1
4
2 1 0 0
1 2 1 0
0 2 3 1
2 2 0 1
*/